//
// Created by kuang on 2025/9/19.
//

#ifndef IENA_IENA_PARSER_H
#define IENA_IENA_PARSER_H


#include <stdint.h>

/* 最大参数数量限制 */
#define IENA_MAX_PARAMS 64

/* IENA解析后的完整包结构 */
typedef struct {
    /* 包头信息 */
    uint16_t iena_key;      /* IENA Key */
    uint16_t size;          /* 包总大小 */
    uint64_t timestamp;     /* 48位时间戳 */
    uint8_t  key_status;    /* 键状态 */
    uint8_t  status;        /* 运行状态 */
    uint16_t seq_num;       /* 序列号 */

    /* 包类型信息 */
    char packet_type;       /* 'P', 'M', 'Q', 'D', 'N' */
    uint8_t param_count;    /* 参数个数 */
    uint8_t word_length;    /* 参数字长度 (仅P/D/N型) */

    /* 包状态 */
    int is_valid;           /* 包是否有效 */
    int parse_error;        /* 解析错误码 */

    /* 参数数据 - 根据包类型使用不同字段 */
    union {
        /* P型包参数 - 直接存储数值 */
        struct {
            uint16_t values_u16[IENA_MAX_PARAMS];   /* 16位参数值数组 */
            uint32_t values_u32[IENA_MAX_PARAMS/2]; /* 32位参数值数组 */
        } p_params;

        /* M/Q/D/N型包参数 - 存储参数信息 */
        struct {
            uint16_t param_ids[IENA_MAX_PARAMS];    /* 参数ID数组 */
            uint16_t offsets[IENA_MAX_PARAMS];      /* 时间偏移/延迟值 (M/D型) */
            uint16_t lengths[IENA_MAX_PARAMS];      /* 数据长度数组 */
            const uint8_t* data_ptrs[IENA_MAX_PARAMS]; /* 数据指针数组 */
        } other_params;
    };

} iena_parsed_packet_t;

/* ==================== 核心API - 只需要一个函数 ==================== */

/**
 * 解析IENA包到结构体
 * @param packet: 输出的解析结构
 * @param data: 原始包数据
 * @param size: 包大小
 * @return: 0成功, 非0失败
 */
int iena_parse_packet(iena_parsed_packet_t *packet, const uint8_t *data, uint16_t size);

/* 包头访问 */
#define IENA_GET_KEY(pkt)       ((pkt)->iena_key)
#define IENA_GET_SIZE(pkt)      ((pkt)->size)
#define IENA_GET_TIMESTAMP(pkt) ((pkt)->timestamp)
#define IENA_GET_SEQ(pkt)       ((pkt)->seq_num)
#define IENA_GET_TYPE(pkt)      ((pkt)->packet_type)
#define IENA_GET_COUNT(pkt)     ((pkt)->param_count)

/* P型包参数访问 */
#define IENA_GET_P_U16(pkt, i)  ((pkt)->p_params.values_u16[i])
#define IENA_GET_P_U32(pkt, i)  ((pkt)->p_params.values_u32[i])

/* M/Q/D/N型包参数访问 */
#define IENA_GET_PARAM_ID(pkt, i)   ((pkt)->other_params.param_ids[i])
#define IENA_GET_PARAM_OFFSET(pkt, i) ((pkt)->other_params.offsets[i])
#define IENA_GET_PARAM_LENGTH(pkt, i) ((pkt)->other_params.lengths[i])
#define IENA_GET_PARAM_DATA(pkt, i)   ((pkt)->other_params.data_ptrs[i])

/* 状态检查 */
#define IENA_IS_VALID(pkt)      ((pkt)->is_valid)
#define IENA_IS_P_TYPE(pkt)     ((pkt)->packet_type == 'P')
#define IENA_IS_M_TYPE(pkt)     ((pkt)->packet_type == 'M')
#define IENA_IS_Q_TYPE(pkt)     ((pkt)->packet_type == 'Q')
#define IENA_IS_D_TYPE(pkt)     ((pkt)->packet_type == 'D')
#define IENA_IS_N_TYPE(pkt)     ((pkt)->packet_type == 'N')
#endif //IENA_IENA_PARSER_H
